package com.example.thread.b4thread3;

import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;

// 使用Callable方式 ，可以获取线程返回的结果
public class MyCallable {
    public static void main(String[] args) throws ExecutionException, InterruptedException {
        // 创建一个Callable对象
        Callable<Object> m1 = new MyCallableTest(5);
        // 把Callable对象封装成一个FutureTask对象（任务对象），
        // 实现了Runnable对象，调用get（）方法获取线程执行完的结果
        FutureTask<Object> futureTask = new FutureTask<>(m1);
        // 把任务对象交给Thread对象
        new Thread(futureTask).start();
        // 获取线程执行完毕后的结果

        // 注意：如果执行到这，上面的线程还没有执行完毕，
        // 这里的代码会暂停，
        // 等待上面线程执行完毕后才会获取结果才会往下执行
        Object o = futureTask.get();
        System.out.println(o);

        for (int i = 0; i < 5; i++) {
            System.out.println("主线程"+i);
        }
    }
}
// 泛型Object就是线程执行完返回的结果类型
class MyCallableTest implements Callable<Object> {
    private  Integer n;

    public MyCallableTest(Integer n) {
        this.n = n;
    }

    @Override
    public Object call() throws Exception {
        int sum = 0;
        for (int i = 0; i < n; i++) {
            sum += i;
        }
        return sum;
    }
}